# 作者：位微
# 你不是在写代码而是在解决问题
# 2025年09月09日18时42分14秒
# 2062873410@qq.com
import numpy as np
import pandas as pd
import matplotlib as plt
df=pd.read_csv('IMDB-Movie-Data.csv')
# 关闭提示信息
print(df["Genre"].head(3))
print("-"*50)
temp_list=df["Genre"].str.split(',').tolist()
genre=list(set([j for i in temp_list for j in i]))
# print(temp_list[0:3])
zero_df=pd.DataFrame(np.zeros((df.shape[0],len(genre))),columns=genre)

for i in range(df.shape[0]):
    zero_df.loc[i,temp_list[i]]=1
# print(zero_df.head())
print(zero_df.sum())
genre_counts= zero_df.sum()
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei"]
plt.rcParams['axes.unicode_minus'] = False  # 正确显示负号

# 创建画布（调整大小，避免类型名称拥挤）
plt.figure(figsize=(12, 6))

# 绘制直方图（x轴=电影类型，y轴=出现次数，设置颜色和边框）
bars = plt.bar(
    x=genre_counts.index,  # x轴：电影类型（Series的索引）
    height=genre_counts.values,  # y轴：类型出现次数（Series的值）
    color='#1f77b4',  # 柱状图颜色（Matplotlib默认蓝）
    edgecolor='black',  # 柱子边框颜色（更清晰）
    alpha=0.8  # 透明度（避免过亮）
)

# ---------------------- 3. 优化图表样式 ----------------------
# 添加标题和坐标轴标签（中文）
plt.title('IMDB电影数据集中各类型电影出现次数分布', fontsize=16, pad=20)  # pad=标题与图表的间距
plt.xlabel('电影类型', fontsize=12, labelpad=10)
plt.ylabel('出现次数', fontsize=12, labelpad=10)

# 旋转x轴标签（避免类型名称重叠）
plt.xticks(rotation=45, ha='right')  # rotation=旋转角度，ha='right'=标签右对齐

# 在每个柱子顶部添加数值标签（直观显示次数）
for bar in bars:
    height = bar.get_height()  # 获取柱子高度（即次数）
    plt.text(
        bar.get_x() + bar.get_width()/2,  # 数值标签的x坐标（柱子中心）
        height + 1,  # 数值标签的y坐标（柱子顶部+1，避免紧贴）
        f'{int(height)}',  # 标签内容（转为整数，避免小数）
        ha='center',  # 水平居中
        va='bottom',  # 垂直靠下
        fontsize=10
    )

# 添加网格线（y轴方向，辅助读值）
plt.grid(axis='y', linestyle='--', alpha=0.5)  # axis='y'=只显示y轴网格

# 调整布局（避免标签被截断）
plt.tight_layout()

# 显示图表
plt.show()